﻿//ChartPart.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Xaml
{
	using System;
	using System.ComponentModel;

	using Ecng.Common;
	using Ecng.Serialization;

	/// <summary>
	/// Базовые класс, описывающий часть графика.
	/// </summary>
	/// <typeparam name="T">Тип элемента графика.</typeparam>
	public abstract class ChartPart<T> : Equatable<T>, IPersistable, INotifyPropertyChanged
		where T : ChartPart<T>
	{
		/// <summary>
		/// Инициализировать <see cref="ChartPart{T}"/>.
		/// </summary>
		protected ChartPart()
		{
			Id = Guid.NewGuid();
		}

		/// <summary>
		/// Уникальный идентификатор.
		/// </summary>
		[Browsable(false)]
		public Guid Id { get; set; }

		/// <summary>
		/// Загрузить настройки.
		/// </summary>
		/// <param name="storage">Хранилище настроек.</param>
		public virtual void Load(SettingsStorage storage)
		{
			Id = storage.GetValue<Guid>("Id");
		}

		/// <summary>
		/// Сохранить настройки.
		/// </summary>
		/// <param name="storage">Хранилище настроек.</param>
		public virtual void Save(SettingsStorage storage)
		{
			storage.SetValue("Id", Id);
		}

		/// <summary>
		/// Сравнить два элемента на эквивалентность.
		/// </summary>
		/// <param name="other">Другой элемент, с которым необходимо сравнивать.</param>
		/// <returns>true, если другой элемент равен текущему, иначе false.</returns>
		protected override bool OnEquals(T other)
		{
			return other.Id == Id;
		}

		/// <summary>
		/// Рассчитать хеш-код объекта <see cref="ChartElement{T}" />.
		/// </summary>
		/// <returns>Хеш-код.</returns>
		public override int GetHashCode()
		{
			return Id.GetHashCode();
		}

		/// <summary>
		/// Заполнить копию элемента.
		/// </summary>
		/// <param name="elem">Копия.</param>
		/// <returns>Копия.</returns>
		protected virtual T FillClone(T elem)
		{
			if (elem == null)
				throw new ArgumentNullException("elem");

			elem.Id = Id;

			return elem;
		}

		private PropertyChangedEventHandler _propertyChanged;

		event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
		{
			add { _propertyChanged += value; }
			remove { _propertyChanged -= value; }
		}

		/// <summary>
		/// Вызвать событие <see cref="INotifyPropertyChanged.PropertyChanged"/>.
		/// </summary>
		/// <param name="name">Название свойства.</param>
		protected void RaisePropertyChanged(string name)
		{
			_propertyChanged.SafeInvoke(this, name);
		}
	}
}